factory pattern implementation